Main Text Figures

comb_epr_plot = comb_preds %>% 
  filter(metric == "EPR") %>% 
  ggplot() +
  geom_point(aes(temp, rate, colour = curve_id), 
             filter(comb_d, metric == "EPR"), 
             size = 1.5, alpha = 0.6, 
             position = position_jitter(width = 0.5, height = 0)) +
  geom_ribbon(aes(temp, ymin = conf_lower, ymax = conf_upper, group = curve_id), 
              filter(comb_boot_conf_preds, metric == "EPR"), 
              fill = 'grey60', alpha = 0.3) +
  geom_line(aes(temp, .fitted, col = curve_id), linewidth = 2) +
  scale_colour_manual(values = comb_colors) + 
  labs(x = "", 
       y = "Egg Production \n(eggs/female/day)",
       colour = "Month") + 
  theme_matt(base_size = 12)

comb_hs_plot = comb_preds %>% 
  filter(metric == "HF") %>% 
  ggplot() +
  geom_point(aes(temp, rate, colour = curve_id), filter(comb_d, metric == "HF"), size = 1.5, alpha = 0.6, 
             position = position_jitter(width = 0.5, height = 0)) +
  geom_ribbon(aes(temp, ymin = conf_lower, ymax = conf_upper, group = curve_id), filter(comb_boot_conf_preds, metric == "HF"), fill = 'grey60', alpha = 0.3) +
  geom_line(aes(temp, .fitted, col = curve_id), linewidth = 2) +
  #scale_color_brewer(type = "div", palette = 5, direction = -1) + 
  #scale_color_viridis_d(option = "mako") + 
  scale_colour_manual(values = comb_colors) + 
  labs(x = "", 
       y = "Hatching Success \n(%)",
       colour = "Month") + 
  theme_matt(base_size = 12)

comb_rf_plot = comb_preds %>% 
  filter(metric == "RF") %>% 
  ggplot() +
  geom_point(aes(temp, rate, colour = curve_id), filter(comb_d, metric == "RF"), size = 1.5, alpha = 0.6, 
             position = position_jitter(width = 0.5, height = 0)) +
  geom_ribbon(aes(temp, ymin = conf_lower, ymax = conf_upper, group = curve_id), filter(comb_boot_conf_preds, metric == "RF"), fill = 'grey60', alpha = 0.3) +
  geom_line(aes(temp, .fitted, col = curve_id), linewidth = 2) +
  #scale_color_brewer(type = "div", palette = 5, direction = -1) + 
  #scale_color_viridis_d(option = "mako") + 
  scale_colour_manual(values = comb_colors) + 
  labs(x = "Temperature (°C)", 
       y = "Offspring Production \n(offspring/female/day)",
       colour = "Month") + 
  theme_matt(base_size = 12)

comb_tsc = ggplot(comb_surv, aes(x=Temp, y=Surv, colour=Month)) + 
  geom_point(size=1.5, position=position_jitter(width=0.1, height=0.03)) +
  xlab("Temperature (°C)")+
  ylab("Survivorship \n(proportion survived)")+
  labs(colour = "Month") + 
  geom_hline(yintercept = 0.5, linetype = "dashed") +
  geom_smooth(method = "glm", method.args = list(family = "binomial"), se=T, linewidth = 2) +
  scale_y_continuous(breaks = c(0,1)) + 
  #scale_color_brewer(type = "div", palette = 5, direction = -1) + 
  #scale_color_viridis_d(option = "mako") + 
  scale_colour_manual(values = comb_colors) + 
  theme_matt(base_size = 12)

ggarrange(comb_epr_plot, comb_hs_plot, comb_rf_plot, comb_tsc, 
          ncol = 2, nrow = 2,
          common.legend = T, legend = "bottom", 
          labels = "AUTO", vjust = 1)


# ggarrange(comb_epr_plot, comb_hs_plot, comb_rf_plot, comb_tsc, nrow = 1,
#           common.legend = T, legend = "bottom")
combined_opt_coll = comb_params %>% 
  filter(metric == "RF" & term == "topt") %>% 
  ggplot(aes(x = growth_temp, y = estimate, shape = species)) + 
  geom_smooth(data = filter(comb_params, metric == "RF" & term == "topt" & curve_id != "November_2"),
              method = "lm", colour = "grey50") + 
  geom_point(size = 3, stroke = 1) + 
  scale_shape_manual(values = c(16,21)) + 
  ylab("Optimum (°C)") + 
  xlab("Collection Temperature (°C)") + 
  labs(colour = "Month") + 
  theme_matt(base_size = 12)

combined_opt_diff = comb_params %>% 
  filter(metric == "RF" & term == "topt") %>% 
  ggplot(aes(x = growth_temp, y = margin, shape = species)) +
  geom_hline(yintercept = 0, linewidth =1, linetype = "dashed") +
  geom_smooth(data = filter(comb_params, metric == "RF" & term == "topt" & curve_id != "November_2"),
              method = "lm", colour = "grey50") + 
  geom_point(size = 3, stroke = 1) + 
  ylab("Margin (°C)") + 
  xlab("Collection Temperature (°C)") + 
  scale_shape_manual(values = c(16,21)) + 
  theme_matt(base_size = 12) 

combined_ld_coll = ggplot(combined_tolerance, aes(x = Coll_temp, y = LD50, shape = species)) + 
  geom_smooth(method = "lm", colour = "grey50") + 
  geom_point(size = 3, stroke = 1) + 
  scale_shape_manual(values = c(16,21)) + 
  ylab("Thermal Tolerance (°C)") + 
  xlab("Collection Temperature (°C)") + 
  theme_matt(base_size = 12)

combined_ld_diff = ggplot(combined_tolerance, aes(x = Coll_temp, y = margin, shape = species)) +
  geom_smooth(method = "lm", colour = "grey50") + 
  geom_point(size = 3, stroke = 1) + 
  scale_shape_manual(values = c(16,21)) + 
  ylab("Warming Tolerance (°C)") + 
  xlab("Collection Temperature (°C)") + 
  theme_matt(base_size = 12)

ggarrange(combined_opt_coll, combined_opt_diff, combined_ld_coll, combined_ld_diff, ncol = 2, nrow = 2, common.legend = T,
          legend = "bottom", labels = "AUTO")

x.axis_labels = c("1" = "short", "2" = "long", "3" = "short", "4" = "long")

F0_grid = F0_rf_summary %>%
  mutate(month = fct_relevel(month, "June", "August", "November")) %>%
  ggplot(aes(x = duration, y = difference, colour = trait, shape = duration)) +
  facet_grid(. ~ month) +
  geom_hline(yintercept = 0, colour = "black", linewidth = 0.3) +
  geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, linewidth = 1.3) +
  geom_point(size = 5, fill = "white") +
  scale_colour_manual(values = c("body size" = "grey75", "production" = "black")) +
  scale_shape_manual(values = c("long" = 16, "short" = 21)) +
  scale_x_discrete(labels= x.axis_labels) +
  ggtitle("Direct Effects (F0)") +
  xlab("") +
  ylab("Effect Size\nHeatwave - Control") +
  ylim(-1,1.1) +
  theme_bw(base_size = 12) +
  theme(panel.grid = element_blank(),
        axis.text = element_text(colour = "black"),
        axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5),
        legend.position = "none")

F1_summary = bind_rows(F1_rf_effect_size, F1_bs_effect_size) %>%
  dplyr::select(variable, difference,
                bca_ci_low, bca_ci_high,
                month, duration, trait, generation, off_temp) %>%
  mutate("order_code" = paste(trait, duration, sep = "_"),
         "order_number" = case_when(
           order_code == "production_short" ~ 1,
           order_code == "production_long" ~ 2,
           order_code == "body size_short" ~ 3,
           order_code == "body size_long" ~ 4),
         month = fct_relevel(month, "June", "August", "November"))

F1_summary$order_number = factor(F1_summary$order_number, levels = c(1,2,3,4))
F1_grid = ggplot(F1_summary, aes(x = order_number, y = difference, colour = trait, shape = duration, group = trait)) +
  facet_grid(off_temp ~ month, ) +
  geom_hline(yintercept = 0, colour = "black", linewidth = 0.3) +
  geom_line() +
  geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, linewidth = 1) +
  geom_point(size = 3, fill = "white") +
  scale_colour_manual(values = c("body size" = "grey75", "production" = "black")) +
  scale_shape_manual(values = c("long" = 16, "short" = 21)) +
  xlim(0.5,4.5) +
  scale_x_discrete(labels= x.axis_labels) +
  xlab("") +
  ylab("Effect Size\nHeatwave - Control") +
  ggtitle("Transgenerational Effects (F1)") +
  theme_bw(base_size = 12) +
  theme(panel.grid = element_blank(),
        strip.background.x = element_blank(),
        strip.text.x = element_blank(),
        axis.text = element_text(colour = "black"),
        axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5))

ggarrange(F0_grid, F1_grid, nrow = 2, ncol = 1, heights = c(0.45,1), common.legend = T, legend = "right")

Supplemental Information

#field tpc parameters
comb_params %>%  
  mutate(curve_id = fct_relevel(curve_id, c("January", "February", "March", "April", "May", "June", 
                                            "July", "August", "September", "October", "November_1", "November_2"))) %>% 
  ggplot(aes(x = curve_id, y = estimate, colour = species)) +
  facet_wrap(term~metric, scales = 'free_y') + 
  geom_point(size = 4) +
  geom_linerange(aes(ymin = conf_lower, ymax = conf_upper)) +
  scale_colour_manual(values = c("royalblue1", "indianred2")) + 
  labs(x = "Month",
       y = "Parameter Estimate",
       colour = "Species") + 
  theme_bw(base_size = 16) +
  theme(panel.grid = element_blank(),
        axis.text.x = element_text(angle = 315, hjust = 0, vjust = 0.5))

#field tpc parameters
ggplot(comb_params, aes(x = growth_temp, y = estimate, colour = species)) +
  facet_wrap(term~metric, scales = 'free_y') + 
  geom_smooth(data = filter(comb_params, curve_id != "November_2"),
              method = "lm", se = F) + 
  geom_point(size = 4) +
  geom_linerange(aes(ymin = conf_lower, ymax = conf_upper)) +
  scale_colour_manual(values = c("royalblue1", "indianred2")) + 
  labs(x = "Collection Temperature (°C)",
       y = "Parameter Estimate",
       colour = "Species") + 
  theme_bw(base_size = 12) +
  theme(panel.grid = element_blank())

f1_size_data = F1_fbs %>% 
  ungroup() %>% 
  mutate(Day = if_else(Day == "1_to_3", "Short", "Long"),
         Month = fct_relevel(Month, "June", "August", "November"),
         Day = fct_relevel(Day, "Short", "Long"),
         Parental_treatment = fct_relevel(Parental_treatment, "Heatwave", "Control"))


F1_size.model = lm(data = f1_size_data,
                    Size ~ Parental_treatment * Day * Offspring_temp * Month)

performance::check_model(F1_size.model, check = c("pp_check", "linearity", "homogeneity", "outliers", "qq"))

tsm = comb_params %>% 
  filter(metric == "RF" & term == "topt") %>% 
  filter(margin < 15) %>% 
  select("Month" = curve_id, species, "Coll_temp" = growth_temp, margin)

wt = combined_tolerance %>% 
  select(Month, species, Coll_temp, margin)

tsm_slopes = lm(data = tsm, margin ~ Coll_temp * species) %>% 
  emmeans::emtrends(~species, var = "Coll_temp") %>% 
  data.frame()

tsm_slope_plot = ggplot(tsm_slopes, aes(x = species, y = Coll_temp.trend)) + 
  geom_hline(yintercept = 0) + 
  geom_point(size = 4) + 
  geom_errorbar(aes(ymin = lower.CL, ymax = upper.CL),  
                width = 0.1, linewidth = 1) + 
  labs(x = "Species",
       y = "Safety Margin Slope\n(°C/°C)") + 
  theme_matt()

wt_slopes = lm(data = wt, margin ~ Coll_temp * species) %>% 
  emmeans::emtrends(~species, var = "Coll_temp") %>% 
  data.frame()

wt_slope_plot = ggplot(wt_slopes, aes(x = species, y = Coll_temp.trend)) + 
  geom_hline(yintercept = 0) + 
  geom_point(size = 4) + 
  geom_errorbar(aes(ymin = lower.CL, ymax = upper.CL),  
                width = 0.1, linewidth = 1) + 
  labs(x = "Species",
       y = "Warming Tolerance Slope\n(°C/°C)") + 
  theme_matt()

ggarrange(tsm_slope_plot, wt_slope_plot, labels = "AUTO")

f0_model_females = F0_epr %>% 
  group_by(Month, Treatment, Female) %>% 
  count() %>% 
  filter(n == 2) %>% 
  mutate('female_ID' = paste(Month, Treatment, Female, sep = "_"))

f0_model_data = F0_epr %>% 
  mutate('female_ID' = paste(Month, Treatment, Female, sep = "_")) %>% 
  filter(female_ID %in% f0_model_females$female_ID) %>% 
  mutate(Day = if_else(Day == "1_to_3", "Short", "Long"),
         Month = fct_relevel(Month, "June", "August", "November"),
         Day = fct_relevel(Day, "Short", "Long"))

f1_model_data = F1_epr %>% 
  mutate(Offspring_temp = as.factor(Offspring_temp)) %>% 
  ungroup() %>% 
  mutate(Day = if_else(Day == "1_to_3", "Short", "Long"),
         Month = fct_relevel(Month, "June", "August", "November"),
         Day = fct_relevel(Day, "Short", "Long")) %>% 
  mutate(Parental_treatment = fct_relevel(Parental_treatment, "Heatwave", "Control"))

f0_epr_plot = ggplot(f0_model_data, 
                 aes(x = Day, y = Total, colour = Treatment)) + 
  facet_grid(.~Month, scales = "free_y") + 
  geom_hline(yintercept = 0) + 
  geom_boxplot(position = position_dodge(width = 0.5),
               width = 0.3) + 
  geom_point(position = position_dodge(width = 0.5),
             alpha = 0.5) + 
  scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) + 
  labs(y = "Egg Production \n(per female per day)") + 
  theme_matt() + 
  theme(panel.border = element_rect(fill = NA, colour = "black"),
        legend.position = "bottom",
        axis.text.x = element_text(angle = 300, hjust = 0, vjust = 0.5),
        axis.title.x = element_blank(),
        strip.text = element_text(size = 18))

f1_epr_plot = ggplot(f1_model_data, 
                 aes(x = factor(Offspring_temp), y = Total, colour = Parental_treatment)) + 
  facet_grid(Month~Day) + 
  #geom_violin(position = position_dodge(width = 1)) + 
  geom_boxplot(position = position_dodge(width = 0.5),
               width = 0.3) + 
  geom_point(position = position_dodge(width = 0.5),
             alpha = 0.5) + 
  scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) + 
  scale_y_continuous(breaks = c(0, 100, 200)) + 
  labs(x = "Offspring Temp. (°C)", 
       y = "Egg Production \n(per female per day)",
       colour = "Parental Treatment") + 
  theme_matt() + 
  theme(panel.border = element_rect(fill = NA, colour = "black"),
        legend.position = "bottom",
        strip.text = element_text(size = 18))

raw_epr = ggarrange(f0_epr_plot, f1_epr_plot, nrow = 2, 
          heights = c(0.3, 0.7), common.legend = T, legend = "bottom")

###

f0_hs_plot = ggplot(f0_model_data, 
                 aes(x = Day, y = Success, colour = Treatment)) + 
  facet_grid(.~Month, scales = "free_y") + 
  geom_hline(yintercept = 0) + 
  geom_boxplot(position = position_dodge(width = 0.5),
               width = 0.3) + 
  geom_point(position = position_dodge(width = 0.5),
             alpha = 0.5) + 
  scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) + 
  labs(y = "Hatching Success") + 
  theme_matt() + 
  theme(panel.border = element_rect(fill = NA, colour = "black"),
        legend.position = "bottom",
        axis.text.x = element_text(angle = 300, hjust = 0, vjust = 0.5),
        axis.title.x = element_blank(),
        strip.text = element_text(size = 18))

f1_hs_plot = ggplot(f1_model_data, 
                 aes(x = factor(Offspring_temp), y = Success, colour = Parental_treatment)) + 
  facet_grid(Month~Day) + 
  #geom_violin(position = position_dodge(width = 1)) + 
  geom_boxplot(position = position_dodge(width = 0.5),
               width = 0.3) + 
  geom_point(position = position_dodge(width = 0.5),
             alpha = 0.5) + 
  scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) + 
  scale_y_continuous(breaks = c(0, 1)) + 
  labs(x = "Offspring Temp. (°C)", 
       y = "Hatching Success",
       colour = "Parental Treatment") + 
  theme_matt() + 
  theme(panel.border = element_rect(fill = NA, colour = "black"),
        legend.position = "bottom",
        strip.text = element_text(size = 18))

raw_hs = ggarrange(f0_hs_plot, f1_hs_plot, nrow = 2, 
          heights = c(0.3, 0.7), common.legend = T, legend = "bottom")

###

f0_prod_plot = ggplot(f0_model_data, 
                 aes(x = Day, y = Hatched, colour = Treatment)) + 
  facet_grid(.~Month, scales = "free_y") + 
  geom_hline(yintercept = 0) + 
  geom_boxplot(position = position_dodge(width = 0.5),
               width = 0.3) + 
  geom_point(position = position_dodge(width = 0.5),
             alpha = 0.5) + 
  scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) + 
  labs(y = "Offspring Production \n(per female per day)") + 
  theme_matt() + 
  theme(panel.border = element_rect(fill = NA, colour = "black"),
        legend.position = "bottom",
        axis.text.x = element_text(angle = 300, hjust = 0, vjust = 0.5),
        axis.title.x = element_blank(),
        strip.text = element_text(size = 18))

f1_prod_plot = ggplot(f1_model_data, 
                 aes(x = factor(Offspring_temp), y = Hatched, colour = Parental_treatment)) + 
  facet_grid(Month~Day) + 
  #geom_violin(position = position_dodge(width = 1)) + 
  geom_boxplot(position = position_dodge(width = 0.5),
               width = 0.3) + 
  geom_point(position = position_dodge(width = 0.5),
             alpha = 0.5) + 
  scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) + 
  scale_y_continuous(breaks = c(0, 100, 200)) + 
  labs(x = "Offspring Temp. (°C)", 
       y = "Offspring Production \n(per female per day)",
       colour = "Parental Treatment") + 
  theme_matt() + 
  theme(panel.border = element_rect(fill = NA, colour = "black"),
        legend.position = "bottom",
        strip.text = element_text(size = 18))

raw_production = ggarrange(f0_prod_plot, f1_prod_plot, nrow = 2, 
          heights = c(0.3, 0.7), common.legend = T, legend = "bottom")

ggarrange(raw_epr, raw_hs, raw_production, nrow = 1, common.legend = T, legend = "bottom",
          labels = "AUTO")

#Subsequent Rows
F1_hs_effect_size$trait = "HS"
F1_hs_effect_size$generation = "F1"

F1_total_effect_size$trait = "EPR"
F1_total_effect_size$generation = "F1"

F1_rf_effect_size$trait = "OP"
F1_rf_effect_size$generation = "F1"

F1_bs_effect_size$trait = "Size"
F1_bs_effect_size$generation = "F1"

F0_size_summary = data.frame("trait" = "Size", generation = "F0", month = "June", duration = "long")

F0_data = bind_rows(F0_hs_summary, F0_total_summary,F0_rf_summary, F0_size_summary) %>%
  dplyr::select(trait, difference, bca_ci_low, bca_ci_high, month, duration, trait, generation) %>%
  mutate("order_code" = paste(trait, duration, sep = "_"),
         "order_number" = case_when(
           order_code == "total_short" ~ 1,
           order_code == "total_long" ~ 2,
           order_code == "success_short" ~ 3,
           order_code == "success_long" ~ 4,
           order_code == "production_short" ~ 5,
           order_code == "production_long" ~ 6,
           order_code == "size_long" ~ 7),
         month = fct_relevel(month, "June", "August", "November"),
         trait = case_when(
           trait == "total" ~ "EPR", 
           trait == "success" ~ "HS", 
           trait == "production" ~ "OP", 
           trait == "Size" ~ "Size"),
           fct_relevel(trait, "EPR", "HS", "OP", "Size"),
         duration = fct_relevel(duration, "short", "long"),
         group_ID = paste(month, trait, sep = "_"))

F0_data$order_number = factor(F0_data$order_number, levels = c(1,2,3,4,5,6,7))


F1_data = bind_rows(F1_total_effect_size, F1_hs_effect_size, F1_rf_effect_size, F1_bs_effect_size) %>%
  dplyr::select(trait, difference, bca_ci_low, bca_ci_high, month, duration, generation, off_temp) %>%
  mutate("order_code" = paste(trait, duration, sep = "_"),
         "order_number" = case_when(
           order_code == "EPR_short" ~ 1,
           order_code == "EPR_long" ~ 2,
           order_code == "HS_short" ~ 3,
           order_code == "HS_long" ~ 4,
           order_code == "OP_short" ~ 5,
           order_code == "OP_long" ~ 6,
           order_code == "Size_short" ~ 7,
           order_code == "Size_long" ~ 8),
         trait = if_else(trait == "epr", "total", trait),
         month = fct_relevel(month, "June", "August", "November"),
         trait = fct_relevel(trait, "EPR", "HS", "OP", "Size"),
         duration = fct_relevel(duration, "short", "long"))


F1_data$order_number = factor(F1_data$order_number, levels = c(1,2,3,4,5,6,7,8))

#Top row - F0 (direct effects)
x.axis_labels = c("1" = "short", "2" = "long", "3" = "short", "4" = "long",
                  "5" = "short", "6" = "long", "7" = "short", "8" = "long")

F0_grid = ggplot(F0_data, aes(x = duration, y = difference, colour = trait, group = group_ID)) +
  facet_grid(. ~ month) +
  geom_line(position = position_dodge(width = 0.7),
            linewidth = 1) +
  geom_hline(yintercept = 0, colour = "black", linewidth = 0.3) +
  geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, linewidth = 1,
                position = position_dodge(width = 0.7)) +
  geom_point(size = 4, fill = "white", position = position_dodge(width = 0.7)) +
  scale_shape_manual(values = c("long" = 16, "short" = 21)) +
  scale_x_discrete(labels= x.axis_labels) +
  scale_colour_manual(values = c("Size" = "darkgrey",
                                 "HS" = "gold",
                                 "OP" = "forestgreen",
                                 "EPR" = "cornflowerblue")) +
  xlab("") +
  ylab("Effect Size\nHeatwave - Control") +
  theme_bw(base_size = 12) +
  theme(panel.grid = element_blank(),
        axis.text = element_text(colour = "black"),
        axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5),
        legend.position = "none")

#Following three rows - F1 (transgeneration / indirect effects)
F1_grid = ggplot(F1_data, aes(x = duration, y = difference, colour = trait, group = trait)) +
  facet_grid(off_temp ~ month, ) +
  geom_hline(yintercept = 0, colour = "black", linewidth = 0.3) +
  geom_line(position = position_dodge(width = 0.5),
            linewidth = 1) +
  geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, linewidth = 1,
                position = position_dodge(width = 0.5)) +
  geom_point(size = 3, fill = "white", position = position_dodge(width = 0.5)) +
  scale_shape_manual(values = c("long" = 16, "short" = 21)) +
  xlim(0.5,4.5) +
  scale_x_discrete(labels= x.axis_labels) +
  scale_colour_manual(values = c("Size" = "darkgrey",
                                 "HS" = "gold",
                                 "OP" = "forestgreen",
                                 "EPR" = "cornflowerblue")) +
  xlab("") +
  ylab("Effect Size \nHeatwave - Control") +
  theme_bw(base_size = 12) +
  theme(panel.grid = element_blank(),
        strip.background.x = element_blank(),
        strip.text.x = element_blank(),
        axis.text = element_text(colour = "black"),
        axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5))

ggarrange(F0_grid, F1_grid, nrow = 2, ncol = 1, heights = c(0.35,1), common.legend = T, legend = "right", labels = "AUTO")

F0_rf_summary$month = factor(F0_rf_summary$month, levels = c("June", "August", "November"))
F0_rf_summary$duration = factor(F0_rf_summary$duration, levels = c("short", "long"))
F0_dur_summary$month = factor(F0_dur_summary$month, levels = c("June", "August", "November"))

ggplot(F0_dur_summary, aes(x = month, y = difference, fill = treatment)) + 
  geom_hline(yintercept = 0) + 
  geom_bar(stat = "identity", 
           position = position_dodge(width = 0.9),
           colour = "black") + 
  geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high),
                position = position_dodge(width = 0.9),
                width = 0.2, linewidth = 0.75) + 
  scale_fill_manual(values = c("Control" = "grey30", "Heatwave" = "white")) + 
  labs(y = "Effect Size (Hedge's g)\nLong - Short events",
       x = "") + 
  theme_matt()

effect_corr = F1_summary %>%
  select(trait, difference, month, duration, off_temp) %>%
  pivot_wider(id_cols = c(month, duration, off_temp),
              names_from = trait,
              values_from = difference)

ggplot(effect_corr, aes(x = `body size`, y = production)) +
  geom_hline(yintercept = 0) +
  geom_vline(xintercept = 0) +
  geom_point(size = 3) +
  geom_smooth(method = "lm", se = F,
              colour = "grey60",
              size = 1) +
  labs(x = "Body Size Effect",
       y = "Production Effect") +
  theme_matt()

day_cols = c("Short" = "grey80", "Long" = "grey30")

size_temp1 = ggplot(f1_size_data, aes(x = Offspring_temp, y = Size, colour = Parental_treatment)) + 
  facet_grid(Month~Day) + 
  geom_jitter(width = 0.5, size = 1.6, alpha = 0.4) +
  geom_smooth(method = "lm", linewidth = 1.4, alpha = 0.2) + 
  labs(x = "Offspring Temperature (°C)",
       y = "Size (mm)",
       colour = "Parental Treatment") + 
  scale_x_continuous(breaks = c(12,17,22)) + 
  scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) + 
  theme_matt(base_size = 15) + theme(legend.position = "bottom",
                                     panel.grid = element_blank(),
                                     panel.border = element_rect(fill = NA, colour = "black"))

size_temp2 = emmeans::emtrends(F1_size.model, c("Month", "Day", "Parental_treatment"), var = "Offspring_temp") %>% 
  as.data.frame() %>% 
  ggplot(aes(x = Parental_treatment, y = Offspring_temp.trend, 
             colour = Day, group = Day)) + 
  facet_wrap(Month~.) + 
  geom_hline(yintercept = 0) + 
  geom_line(linewidth = 1.5,
            position = position_dodge(width = 0.5)) + 
  geom_errorbar(aes(ymin = lower.CL, ymax = upper.CL),
                linewidth = 1.5, width = 0.5,
                position = position_dodge(width = 0.5)) + 
  geom_point(size = 3,
             position = position_dodge(width = 0.5)) + 
  scale_colour_manual(values = day_cols) + 
  labs(x = "Parental Treatment",  
       y = "Size Slope (mm / °C)") + 
  theme_matt(base_size = 15) + 
  theme(legend.position = "bottom",
        axis.text.x = element_text(angle = 290,
                                   hjust = 0, vjust = 0.5),
        plot.background = element_rect(fill = "white"))

ggarrange(size_temp1, size_temp2, labels = "AUTO", common.legend = F, legend = "bottom")

f1_size_contrasts = emmeans::emmeans(F1_size.model, ~ Parental_treatment | Day * Month * Offspring_temp, type = "response", at = list(Offspring_temp = c(12,17,22))) %>% 
  pairs() %>% data.frame() %>% 
  drop_na() %>% 
  mutate("ID" = paste0(Month, Offspring_temp)) %>% 
  filter(!(ID == "November12" & Day == "Short")) %>% 
  filter(!(ID == "November22" & Day == "Short"))

ggplot(f1_size_contrasts, aes(x = Day, y = estimate, group = ID)) +
  facet_grid(Offspring_temp~Month) + 
  geom_hline(yintercept = 0) + 
  geom_line(linewidth = 0.8) + 
  geom_point(size = 2) + 
  geom_errorbar(aes(ymin = estimate - SE, ymax = estimate + SE), width = 0.1, linewidth = 1) + 
  labs(x = "Duration",
       y = "Effect (mm; Control - Heatwave)") + 
  theme_bw() + 
  theme(panel.grid = element_blank())

LS0tCnRpdGxlOiAiRmlndXJlcyBmb3IgU2Vhc29uYWxseSB2YXJpYWJsZSB0aGVybWFsIHBlcmZvcm1hbmNlIGN1cnZlcyBwcmV2ZW50IGFkdmVyc2UgZWZmZWN0cyBvZiBoZWF0d2F2ZXMiCmF1dGhvcjogU2FzYWtpIGV0IGFsLiAtIEpvdXJuYWwgb2YgQW5pbWFsIEVjb2xvZ3kgCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgICAgICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgICAgICAgdG9jOiB0cnVlCiAgICAgICAgICB0b2NfZmxvYXQ6IHRydWUKICBnaXRodWJfZG9jdW1lbnQ6CiAgICAgICAgICB0b2M6IHRydWUKICAgICAgICAgIHRvY19kZXB0aDogMgogICAgICAgICAgaHRtbF9wcmV2aWV3OiBmYWxzZQplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgZmlnLmFsaWduPSJjZW50ZXIiLCBtZXNzYWdlID0gRiwgd2FybmluZyA9IEZ9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0ga25pdHI6OmlzX2h0bWxfb3V0cHV0KCksCiAgZmlnLmFsaWduID0gImxlZnQiLAogIGZpZy5wYXRoID0gIi4uL0ZpZ3VyZXMvbWFya2Rvd24vIiwKICBtZXNzYWdlID0gRkFMU0UsCiAgd2FybmluZyA9IEZBTFNFLAogIGNvbGxhcHNlID0gVCwKICBkZXYgPSBjKCJwbmciLCAicGRmIikKKQoKc3QuZXJyIDwtIGZ1bmN0aW9uKHgsIG5hLnJtPUZBTFNFKSB7CiAgaWYobmEucm09PVRSVUUpIHggPC0gbmEub21pdCh4KQogIHNkKHgpL3NxcnQobGVuZ3RoKHgpKQp9Cgp0aGVtZV9tYXR0ID0gZnVuY3Rpb24oYmFzZV9zaXplID0gMTgsCiAgICAgICAgICAgICAgICAgICAgICBkYXJrX3RleHQgPSAiZ3JleTIwIil7CiAgbWlkX3RleHQgPC0gIG1vbm9jaHJvbWVSOjpnZW5lcmF0ZV9wYWxldHRlKGRhcmtfdGV4dCwgImdvX2xpZ2h0ZXIiLCBuX2NvbG91cnMgPSA1KVsyXQogIGxpZ2h0X3RleHQgPC0gIG1vbm9jaHJvbWVSOjpnZW5lcmF0ZV9wYWxldHRlKGRhcmtfdGV4dCwgImdvX2xpZ2h0ZXIiLCBuX2NvbG91cnMgPSA1KVszXQogIAogIGdncHVicjo6dGhlbWVfcHVicihiYXNlX2ZhbWlseT0ic2FucyIpICUrcmVwbGFjZSUgCiAgICB0aGVtZSgKICAgICAgcGFuZWwuYmFja2dyb3VuZCAgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLCAKICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwgCiAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwKICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksCiAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gbWlkX3RleHQsIGxpbmVoZWlnaHQgPSAxLjEpLAogICAgICB0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBkYXJrX3RleHQpLAogICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IG1pZF90ZXh0KSwKICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbigwLCA4LCAwLCAwKSksCiAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9YmFzZV9zaXplICogMC45KSwKICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUgKiAwLjksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiksCiAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAuMjUsIDAuMjUsIDAuMjUsIDAuMjUsImNtIikKICAgICkKfQoKaDFfZXByJE1vbnRoID0gZmFjdG9yKGgxX2VwciRNb250aCwgbGV2ZWxzID0gYygiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9jdG9iZXIiLCAiTm92ZW1iZXJfMSIsICJOb3ZlbWJlcl8yIikpCgpodWRzX2gxX2VwciRNb250aCA9IGZhY3RvcihodWRzX2gxX2VwciRNb250aCwgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIpKQoKdG9uc2FfY29sb3JzID0gYygiSnVseSIgPSAiIzc5MTEwMSIsICJBdWd1c3QiID0gIiNBRDIxMDYiLCAiU2VwdGVtYmVyIiA9ICIjQ0MzNDAzIiwgCiAgICAgICAgICAgICAgICAgIk9jdG9iZXIiID0gIiNFRjVGMDgiLCAiTm92ZW1iZXJfMSIgPSAiI0YyNzAwNiIsICJOb3ZlbWJlcl8yIiA9ICIjRUVCNjBBIikKCmh1ZHNfY29sb3JzID0gYygiSmFudWFyeSIgPSAiIzA2MUIyNCIsICJGZWJydWFyeSIgPSAiIzBGNDI1NiIsICJNYXJjaCIgPSAiIzE1NkQ4RCIsIAogICAgICAgICAgICAgICAgIkFwcmlsIiA9ICIjMkZBQURDIiwgIk1heSIgPSAiIzYxQkZFMyIsICJKdW5lIiA9ICIjOTdENUVFIikKCmNvbWJfY29sb3JzID0gYyhodWRzX2NvbG9ycywgdG9uc2FfY29sb3JzKQoKYSA9IGdncGxvdCgpICsgdGhlbWVfcHViY2xlYW4oKQoKc3VydiRNb250aCA9IGZhY3RvcihzdXJ2JE1vbnRoLCBsZXZlbHMgPSBjKCJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKaHVkc19zdXJ2JE1vbnRoID0gZmFjdG9yKGh1ZHNfc3VydiRNb250aCwgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIpKQoKY29tYl9wcmVkcyRjdXJ2ZV9pZCA9IGZhY3Rvcihjb21iX3ByZWRzJGN1cnZlX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJKYW51YXJ5IiwgIkZlYnJ1YXJ5IiwgIk1hcmNoIiwgIkFwcmlsIiwgIk1heSIsICJKdW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKCmNvbWJfZCRjdXJ2ZV9pZCA9IGZhY3Rvcihjb21iX2QkY3VydmVfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKCmNvbWJfc3VydiRNb250aCA9IGZhY3Rvcihjb21iX3N1cnYkTW9udGgsIAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKCmBgYAoKIyMgTWFpbiBUZXh0IEZpZ3VyZXMKYGBge3IgZmlndXJlLTItY29tYmluZWQtdHBjcywgZmlnLmhlaWdodD02fQpjb21iX2Vwcl9wbG90ID0gY29tYl9wcmVkcyAlPiUgCiAgZmlsdGVyKG1ldHJpYyA9PSAiRVBSIikgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX3BvaW50KGFlcyh0ZW1wLCByYXRlLCBjb2xvdXIgPSBjdXJ2ZV9pZCksIAogICAgICAgICAgICAgZmlsdGVyKGNvbWJfZCwgbWV0cmljID09ICJFUFIiKSwgCiAgICAgICAgICAgICBzaXplID0gMS41LCBhbHBoYSA9IDAuNiwgCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuNSwgaGVpZ2h0ID0gMCkpICsKICBnZW9tX3JpYmJvbihhZXModGVtcCwgeW1pbiA9IGNvbmZfbG93ZXIsIHltYXggPSBjb25mX3VwcGVyLCBncm91cCA9IGN1cnZlX2lkKSwgCiAgICAgICAgICAgICAgZmlsdGVyKGNvbWJfYm9vdF9jb25mX3ByZWRzLCBtZXRyaWMgPT0gIkVQUiIpLCAKICAgICAgICAgICAgICBmaWxsID0gJ2dyZXk2MCcsIGFscGhhID0gMC4zKSArCiAgZ2VvbV9saW5lKGFlcyh0ZW1wLCAuZml0dGVkLCBjb2wgPSBjdXJ2ZV9pZCksIGxpbmV3aWR0aCA9IDIpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNvbWJfY29sb3JzKSArIAogIGxhYnMoeCA9ICIiLCAKICAgICAgIHkgPSAiRWdnIFByb2R1Y3Rpb24gXG4oZWdncy9mZW1hbGUvZGF5KSIsCiAgICAgICBjb2xvdXIgPSAiTW9udGgiKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTIpCgpjb21iX2hzX3Bsb3QgPSBjb21iX3ByZWRzICU+JSAKICBmaWx0ZXIobWV0cmljID09ICJIRiIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9wb2ludChhZXModGVtcCwgcmF0ZSwgY29sb3VyID0gY3VydmVfaWQpLCBmaWx0ZXIoY29tYl9kLCBtZXRyaWMgPT0gIkhGIiksIHNpemUgPSAxLjUsIGFscGhhID0gMC42LCAKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC41LCBoZWlnaHQgPSAwKSkgKwogIGdlb21fcmliYm9uKGFlcyh0ZW1wLCB5bWluID0gY29uZl9sb3dlciwgeW1heCA9IGNvbmZfdXBwZXIsIGdyb3VwID0gY3VydmVfaWQpLCBmaWx0ZXIoY29tYl9ib290X2NvbmZfcHJlZHMsIG1ldHJpYyA9PSAiSEYiKSwgZmlsbCA9ICdncmV5NjAnLCBhbHBoYSA9IDAuMykgKwogIGdlb21fbGluZShhZXModGVtcCwgLmZpdHRlZCwgY29sID0gY3VydmVfaWQpLCBsaW5ld2lkdGggPSAyKSArCiAgI3NjYWxlX2NvbG9yX2JyZXdlcih0eXBlID0gImRpdiIsIHBhbGV0dGUgPSA1LCBkaXJlY3Rpb24gPSAtMSkgKyAKICAjc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWtvIikgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNvbWJfY29sb3JzKSArIAogIGxhYnMoeCA9ICIiLCAKICAgICAgIHkgPSAiSGF0Y2hpbmcgU3VjY2VzcyBcbiglKSIsCiAgICAgICBjb2xvdXIgPSAiTW9udGgiKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTIpCgpjb21iX3JmX3Bsb3QgPSBjb21iX3ByZWRzICU+JSAKICBmaWx0ZXIobWV0cmljID09ICJSRiIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9wb2ludChhZXModGVtcCwgcmF0ZSwgY29sb3VyID0gY3VydmVfaWQpLCBmaWx0ZXIoY29tYl9kLCBtZXRyaWMgPT0gIlJGIiksIHNpemUgPSAxLjUsIGFscGhhID0gMC42LCAKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC41LCBoZWlnaHQgPSAwKSkgKwogIGdlb21fcmliYm9uKGFlcyh0ZW1wLCB5bWluID0gY29uZl9sb3dlciwgeW1heCA9IGNvbmZfdXBwZXIsIGdyb3VwID0gY3VydmVfaWQpLCBmaWx0ZXIoY29tYl9ib290X2NvbmZfcHJlZHMsIG1ldHJpYyA9PSAiUkYiKSwgZmlsbCA9ICdncmV5NjAnLCBhbHBoYSA9IDAuMykgKwogIGdlb21fbGluZShhZXModGVtcCwgLmZpdHRlZCwgY29sID0gY3VydmVfaWQpLCBsaW5ld2lkdGggPSAyKSArCiAgI3NjYWxlX2NvbG9yX2JyZXdlcih0eXBlID0gImRpdiIsIHBhbGV0dGUgPSA1LCBkaXJlY3Rpb24gPSAtMSkgKyAKICAjc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWtvIikgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNvbWJfY29sb3JzKSArIAogIGxhYnMoeCA9ICJUZW1wZXJhdHVyZSAowrBDKSIsIAogICAgICAgeSA9ICJPZmZzcHJpbmcgUHJvZHVjdGlvbiBcbihvZmZzcHJpbmcvZmVtYWxlL2RheSkiLAogICAgICAgY29sb3VyID0gIk1vbnRoIikgKyAKICB0aGVtZV9tYXR0KGJhc2Vfc2l6ZSA9IDEyKQoKY29tYl90c2MgPSBnZ3Bsb3QoY29tYl9zdXJ2LCBhZXMoeD1UZW1wLCB5PVN1cnYsIGNvbG91cj1Nb250aCkpICsgCiAgZ2VvbV9wb2ludChzaXplPTEuNSwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKHdpZHRoPTAuMSwgaGVpZ2h0PTAuMDMpKSArCiAgeGxhYigiVGVtcGVyYXR1cmUgKMKwQykiKSsKICB5bGFiKCJTdXJ2aXZvcnNoaXAgXG4ocHJvcG9ydGlvbiBzdXJ2aXZlZCkiKSsKICBsYWJzKGNvbG91ciA9ICJNb250aCIpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHkgPSAiYmlub21pYWwiKSwgc2U9VCwgbGluZXdpZHRoID0gMikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKDAsMSkpICsgCiAgI3NjYWxlX2NvbG9yX2JyZXdlcih0eXBlID0gImRpdiIsIHBhbGV0dGUgPSA1LCBkaXJlY3Rpb24gPSAtMSkgKyAKICAjc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWtvIikgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNvbWJfY29sb3JzKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTIpCgpnZ2FycmFuZ2UoY29tYl9lcHJfcGxvdCwgY29tYl9oc19wbG90LCBjb21iX3JmX3Bsb3QsIGNvbWJfdHNjLCAKICAgICAgICAgIG5jb2wgPSAyLCBucm93ID0gMiwKICAgICAgICAgIGNvbW1vbi5sZWdlbmQgPSBULCBsZWdlbmQgPSAiYm90dG9tIiwgCiAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIsIHZqdXN0ID0gMSkKCiMgZ2dhcnJhbmdlKGNvbWJfZXByX3Bsb3QsIGNvbWJfaHNfcGxvdCwgY29tYl9yZl9wbG90LCBjb21iX3RzYywgbnJvdyA9IDEsCiMgICAgICAgICAgIGNvbW1vbi5sZWdlbmQgPSBULCBsZWdlbmQgPSAiYm90dG9tIikKYGBgCgpgYGB7ciBmaWd1cmUtMy1jdXJ2ZS1wYXJhbWV0ZXJzLCB3YXJuaW5nID0gRiwgbWVzc2FnZSA9IEYsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTd9CmNvbWJpbmVkX29wdF9jb2xsID0gY29tYl9wYXJhbXMgJT4lIAogIGZpbHRlcihtZXRyaWMgPT0gIlJGIiAmIHRlcm0gPT0gInRvcHQiKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZ3Jvd3RoX3RlbXAsIHkgPSBlc3RpbWF0ZSwgc2hhcGUgPSBzcGVjaWVzKSkgKyAKICBnZW9tX3Ntb290aChkYXRhID0gZmlsdGVyKGNvbWJfcGFyYW1zLCBtZXRyaWMgPT0gIlJGIiAmIHRlcm0gPT0gInRvcHQiICYgY3VydmVfaWQgIT0gIk5vdmVtYmVyXzIiKSwKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBjb2xvdXIgPSAiZ3JleTUwIikgKyAKICBnZW9tX3BvaW50KHNpemUgPSAzLCBzdHJva2UgPSAxKSArIAogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE2LDIxKSkgKyAKICB5bGFiKCJPcHRpbXVtICjCsEMpIikgKyAKICB4bGFiKCJDb2xsZWN0aW9uIFRlbXBlcmF0dXJlICjCsEMpIikgKyAKICBsYWJzKGNvbG91ciA9ICJNb250aCIpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxMikKCmNvbWJpbmVkX29wdF9kaWZmID0gY29tYl9wYXJhbXMgJT4lIAogIGZpbHRlcihtZXRyaWMgPT0gIlJGIiAmIHRlcm0gPT0gInRvcHQiKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZ3Jvd3RoX3RlbXAsIHkgPSBtYXJnaW4sIHNoYXBlID0gc3BlY2llcykpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPTEsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3Ntb290aChkYXRhID0gZmlsdGVyKGNvbWJfcGFyYW1zLCBtZXRyaWMgPT0gIlJGIiAmIHRlcm0gPT0gInRvcHQiICYgY3VydmVfaWQgIT0gIk5vdmVtYmVyXzIiKSwKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBjb2xvdXIgPSAiZ3JleTUwIikgKyAKICBnZW9tX3BvaW50KHNpemUgPSAzLCBzdHJva2UgPSAxKSArIAogIHlsYWIoIk1hcmdpbiAowrBDKSIpICsgCiAgeGxhYigiQ29sbGVjdGlvbiBUZW1wZXJhdHVyZSAowrBDKSIpICsgCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsMjEpKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTIpIAoKY29tYmluZWRfbGRfY29sbCA9IGdncGxvdChjb21iaW5lZF90b2xlcmFuY2UsIGFlcyh4ID0gQ29sbF90ZW1wLCB5ID0gTEQ1MCwgc2hhcGUgPSBzcGVjaWVzKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvdXIgPSAiZ3JleTUwIikgKyAKICBnZW9tX3BvaW50KHNpemUgPSAzLCBzdHJva2UgPSAxKSArIAogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE2LDIxKSkgKyAKICB5bGFiKCJUaGVybWFsIFRvbGVyYW5jZSAowrBDKSIpICsgCiAgeGxhYigiQ29sbGVjdGlvbiBUZW1wZXJhdHVyZSAowrBDKSIpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxMikKCmNvbWJpbmVkX2xkX2RpZmYgPSBnZ3Bsb3QoY29tYmluZWRfdG9sZXJhbmNlLCBhZXMoeCA9IENvbGxfdGVtcCwgeSA9IG1hcmdpbiwgc2hhcGUgPSBzcGVjaWVzKSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJncmV5NTAiKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHN0cm9rZSA9IDEpICsgCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsMjEpKSArIAogIHlsYWIoIldhcm1pbmcgVG9sZXJhbmNlICjCsEMpIikgKyAKICB4bGFiKCJDb2xsZWN0aW9uIFRlbXBlcmF0dXJlICjCsEMpIikgKyAKICB0aGVtZV9tYXR0KGJhc2Vfc2l6ZSA9IDEyKQoKZ2dhcnJhbmdlKGNvbWJpbmVkX29wdF9jb2xsLCBjb21iaW5lZF9vcHRfZGlmZiwgY29tYmluZWRfbGRfY29sbCwgY29tYmluZWRfbGRfZGlmZiwgbmNvbCA9IDIsIG5yb3cgPSAyLCBjb21tb24ubGVnZW5kID0gVCwKICAgICAgICAgIGxlZ2VuZCA9ICJib3R0b20iLCBsYWJlbHMgPSAiQVVUTyIpCmBgYAoKYGBge3IgZmlndXJlLTQtc2ltLWhlYXR3YXZlLWVmZmVjdHMsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTV9CnguYXhpc19sYWJlbHMgPSBjKCIxIiA9ICJzaG9ydCIsICIyIiA9ICJsb25nIiwgIjMiID0gInNob3J0IiwgIjQiID0gImxvbmciKQoKRjBfZ3JpZCA9IEYwX3JmX3N1bW1hcnkgJT4lCiAgbXV0YXRlKG1vbnRoID0gZmN0X3JlbGV2ZWwobW9udGgsICJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBkdXJhdGlvbiwgeSA9IGRpZmZlcmVuY2UsIGNvbG91ciA9IHRyYWl0LCBzaGFwZSA9IGR1cmF0aW9uKSkgKwogIGZhY2V0X2dyaWQoLiB+IG1vbnRoKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3VyID0gImJsYWNrIiwgbGluZXdpZHRoID0gMC4zKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGJjYV9jaV9sb3csIHltYXggPSBiY2FfY2lfaGlnaCksIHdpZHRoID0gMCwgbGluZXdpZHRoID0gMS4zKSArCiAgZ2VvbV9wb2ludChzaXplID0gNSwgZmlsbCA9ICJ3aGl0ZSIpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImJvZHkgc2l6ZSIgPSAiZ3JleTc1IiwgInByb2R1Y3Rpb24iID0gImJsYWNrIikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygibG9uZyIgPSAxNiwgInNob3J0IiA9IDIxKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPSB4LmF4aXNfbGFiZWxzKSArCiAgZ2d0aXRsZSgiRGlyZWN0IEVmZmVjdHMgKEYwKSIpICsKICB4bGFiKCIiKSArCiAgeWxhYigiRWZmZWN0IFNpemVcbkhlYXR3YXZlIC0gQ29udHJvbCIpICsKICB5bGltKC0xLDEuMSkgKwogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDEyKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKCkYxX3N1bW1hcnkgPSBiaW5kX3Jvd3MoRjFfcmZfZWZmZWN0X3NpemUsIEYxX2JzX2VmZmVjdF9zaXplKSAlPiUKICBkcGx5cjo6c2VsZWN0KHZhcmlhYmxlLCBkaWZmZXJlbmNlLAogICAgICAgICAgICAgICAgYmNhX2NpX2xvdywgYmNhX2NpX2hpZ2gsCiAgICAgICAgICAgICAgICBtb250aCwgZHVyYXRpb24sIHRyYWl0LCBnZW5lcmF0aW9uLCBvZmZfdGVtcCkgJT4lCiAgbXV0YXRlKCJvcmRlcl9jb2RlIiA9IHBhc3RlKHRyYWl0LCBkdXJhdGlvbiwgc2VwID0gIl8iKSwKICAgICAgICAgIm9yZGVyX251bWJlciIgPSBjYXNlX3doZW4oCiAgICAgICAgICAgb3JkZXJfY29kZSA9PSAicHJvZHVjdGlvbl9zaG9ydCIgfiAxLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInByb2R1Y3Rpb25fbG9uZyIgfiAyLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gImJvZHkgc2l6ZV9zaG9ydCIgfiAzLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gImJvZHkgc2l6ZV9sb25nIiB+IDQpLAogICAgICAgICBtb250aCA9IGZjdF9yZWxldmVsKG1vbnRoLCAiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSkKCkYxX3N1bW1hcnkkb3JkZXJfbnVtYmVyID0gZmFjdG9yKEYxX3N1bW1hcnkkb3JkZXJfbnVtYmVyLCBsZXZlbHMgPSBjKDEsMiwzLDQpKQpGMV9ncmlkID0gZ2dwbG90KEYxX3N1bW1hcnksIGFlcyh4ID0gb3JkZXJfbnVtYmVyLCB5ID0gZGlmZmVyZW5jZSwgY29sb3VyID0gdHJhaXQsIHNoYXBlID0gZHVyYXRpb24sIGdyb3VwID0gdHJhaXQpKSArCiAgZmFjZXRfZ3JpZChvZmZfdGVtcCB+IG1vbnRoLCApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAwLjMpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGJjYV9jaV9sb3csIHltYXggPSBiY2FfY2lfaGlnaCksIHdpZHRoID0gMCwgbGluZXdpZHRoID0gMSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIGZpbGwgPSAid2hpdGUiKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJib2R5IHNpemUiID0gImdyZXk3NSIsICJwcm9kdWN0aW9uIiA9ICJibGFjayIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoImxvbmciID0gMTYsICJzaG9ydCIgPSAyMSkpICsKICB4bGltKDAuNSw0LjUpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz0geC5heGlzX2xhYmVscykgKwogIHhsYWIoIiIpICsKICB5bGFiKCJFZmZlY3QgU2l6ZVxuSGVhdHdhdmUgLSBDb250cm9sIikgKwogIGdndGl0bGUoIlRyYW5zZ2VuZXJhdGlvbmFsIEVmZmVjdHMgKEYxKSIpICsKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMikgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpKQoKZ2dhcnJhbmdlKEYwX2dyaWQsIEYxX2dyaWQsIG5yb3cgPSAyLCBuY29sID0gMSwgaGVpZ2h0cyA9IGMoMC40NSwxKSwgY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9ICJyaWdodCIpCmBgYAoKIyMgU3VwcGxlbWVudGFsIEluZm9ybWF0aW9uICAgCmBgYHtyIHBhcmFtZXRlcnMtbW9udGgsIGZpZy5oZWlnaHQ9OSwgZmlnLndpZHRoPTExfQojZmllbGQgdHBjIHBhcmFtZXRlcnMKY29tYl9wYXJhbXMgJT4lICAKICBtdXRhdGUoY3VydmVfaWQgPSBmY3RfcmVsZXZlbChjdXJ2ZV9pZCwgYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBjdXJ2ZV9pZCwgeSA9IGVzdGltYXRlLCBjb2xvdXIgPSBzcGVjaWVzKSkgKwogIGZhY2V0X3dyYXAodGVybX5tZXRyaWMsIHNjYWxlcyA9ICdmcmVlX3knKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsKICBnZW9tX2xpbmVyYW5nZShhZXMoeW1pbiA9IGNvbmZfbG93ZXIsIHltYXggPSBjb25mX3VwcGVyKSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygicm95YWxibHVlMSIsICJpbmRpYW5yZWQyIikpICsgCiAgbGFicyh4ID0gIk1vbnRoIiwKICAgICAgIHkgPSAiUGFyYW1ldGVyIEVzdGltYXRlIiwKICAgICAgIGNvbG91ciA9ICJTcGVjaWVzIikgKyAKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMTUsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpKQpgYGAKCmBgYHtyIHBhcmFtZXRlcnMtY29sbC10ZW1wLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05fQojZmllbGQgdHBjIHBhcmFtZXRlcnMKZ2dwbG90KGNvbWJfcGFyYW1zLCBhZXMoeCA9IGdyb3d0aF90ZW1wLCB5ID0gZXN0aW1hdGUsIGNvbG91ciA9IHNwZWNpZXMpKSArCiAgZmFjZXRfd3JhcCh0ZXJtfm1ldHJpYywgc2NhbGVzID0gJ2ZyZWVfeScpICsgCiAgZ2VvbV9zbW9vdGgoZGF0YSA9IGZpbHRlcihjb21iX3BhcmFtcywgY3VydmVfaWQgIT0gIk5vdmVtYmVyXzIiKSwKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBzZSA9IEYpICsgCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKwogIGdlb21fbGluZXJhbmdlKGFlcyh5bWluID0gY29uZl9sb3dlciwgeW1heCA9IGNvbmZfdXBwZXIpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJyb3lhbGJsdWUxIiwgImluZGlhbnJlZDIiKSkgKyAKICBsYWJzKHggPSAiQ29sbGVjdGlvbiBUZW1wZXJhdHVyZSAowrBDKSIsCiAgICAgICB5ID0gIlBhcmFtZXRlciBFc3RpbWF0ZSIsCiAgICAgICBjb2xvdXIgPSAiU3BlY2llcyIpICsgCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTIpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyIHN1cHAtMS1tb2RlbC1wZXJmb3JtYW5jZSwgZmlnLmhlaWdodD0xMSwgZmlnLndpZHRoPTExfQpmMV9zaXplX2RhdGEgPSBGMV9mYnMgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKERheSA9IGlmX2Vsc2UoRGF5ID09ICIxX3RvXzMiLCAiU2hvcnQiLCAiTG9uZyIpLAogICAgICAgICBNb250aCA9IGZjdF9yZWxldmVsKE1vbnRoLCAiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSwKICAgICAgICAgRGF5ID0gZmN0X3JlbGV2ZWwoRGF5LCAiU2hvcnQiLCAiTG9uZyIpLAogICAgICAgICBQYXJlbnRhbF90cmVhdG1lbnQgPSBmY3RfcmVsZXZlbChQYXJlbnRhbF90cmVhdG1lbnQsICJIZWF0d2F2ZSIsICJDb250cm9sIikpCgoKRjFfc2l6ZS5tb2RlbCA9IGxtKGRhdGEgPSBmMV9zaXplX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSB+IFBhcmVudGFsX3RyZWF0bWVudCAqIERheSAqIE9mZnNwcmluZ190ZW1wICogTW9udGgpCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoRjFfc2l6ZS5tb2RlbCwgY2hlY2sgPSBjKCJwcF9jaGVjayIsICJsaW5lYXJpdHkiLCAiaG9tb2dlbmVpdHkiLCAib3V0bGllcnMiLCAicXEiKSkKYGBgCgpgYGB7ciBzdXBwLTItc2FmZXR5LW1hcmdpbi1zbG9wZXMsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD01fQp0c20gPSBjb21iX3BhcmFtcyAlPiUgCiAgZmlsdGVyKG1ldHJpYyA9PSAiUkYiICYgdGVybSA9PSAidG9wdCIpICU+JSAKICBmaWx0ZXIobWFyZ2luIDwgMTUpICU+JSAKICBzZWxlY3QoIk1vbnRoIiA9IGN1cnZlX2lkLCBzcGVjaWVzLCAiQ29sbF90ZW1wIiA9IGdyb3d0aF90ZW1wLCBtYXJnaW4pCgp3dCA9IGNvbWJpbmVkX3RvbGVyYW5jZSAlPiUgCiAgc2VsZWN0KE1vbnRoLCBzcGVjaWVzLCBDb2xsX3RlbXAsIG1hcmdpbikKCnRzbV9zbG9wZXMgPSBsbShkYXRhID0gdHNtLCBtYXJnaW4gfiBDb2xsX3RlbXAgKiBzcGVjaWVzKSAlPiUgCiAgZW1tZWFuczo6ZW10cmVuZHMofnNwZWNpZXMsIHZhciA9ICJDb2xsX3RlbXAiKSAlPiUgCiAgZGF0YS5mcmFtZSgpCgp0c21fc2xvcGVfcGxvdCA9IGdncGxvdCh0c21fc2xvcGVzLCBhZXMoeCA9IHNwZWNpZXMsIHkgPSBDb2xsX3RlbXAudHJlbmQpKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsgCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbG93ZXIuQ0wsIHltYXggPSB1cHBlci5DTCksICAKICAgICAgICAgICAgICAgIHdpZHRoID0gMC4xLCBsaW5ld2lkdGggPSAxKSArIAogIGxhYnMoeCA9ICJTcGVjaWVzIiwKICAgICAgIHkgPSAiU2FmZXR5IE1hcmdpbiBTbG9wZVxuKMKwQy/CsEMpIikgKyAKICB0aGVtZV9tYXR0KCkKCnd0X3Nsb3BlcyA9IGxtKGRhdGEgPSB3dCwgbWFyZ2luIH4gQ29sbF90ZW1wICogc3BlY2llcykgJT4lIAogIGVtbWVhbnM6OmVtdHJlbmRzKH5zcGVjaWVzLCB2YXIgPSAiQ29sbF90ZW1wIikgJT4lIAogIGRhdGEuZnJhbWUoKQoKd3Rfc2xvcGVfcGxvdCA9IGdncGxvdCh3dF9zbG9wZXMsIGFlcyh4ID0gc3BlY2llcywgeSA9IENvbGxfdGVtcC50cmVuZCkpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAKICBnZW9tX3BvaW50KHNpemUgPSA0KSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBsb3dlci5DTCwgeW1heCA9IHVwcGVyLkNMKSwgIAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjEsIGxpbmV3aWR0aCA9IDEpICsgCiAgbGFicyh4ID0gIlNwZWNpZXMiLAogICAgICAgeSA9ICJXYXJtaW5nIFRvbGVyYW5jZSBTbG9wZVxuKMKwQy/CsEMpIikgKyAKICB0aGVtZV9tYXR0KCkKCmdnYXJyYW5nZSh0c21fc2xvcGVfcGxvdCwgd3Rfc2xvcGVfcGxvdCwgbGFiZWxzID0gIkFVVE8iKQpgYGAKCmBgYHtyIHN1cHAtMy1yYXctZGF0YS1wbG90cywgZmlnLndpZHRoPTIwLCBmaWcuaGVpZ2h0PTEyfQpmMF9tb2RlbF9mZW1hbGVzID0gRjBfZXByICU+JSAKICBncm91cF9ieShNb250aCwgVHJlYXRtZW50LCBGZW1hbGUpICU+JSAKICBjb3VudCgpICU+JSAKICBmaWx0ZXIobiA9PSAyKSAlPiUgCiAgbXV0YXRlKCdmZW1hbGVfSUQnID0gcGFzdGUoTW9udGgsIFRyZWF0bWVudCwgRmVtYWxlLCBzZXAgPSAiXyIpKQoKZjBfbW9kZWxfZGF0YSA9IEYwX2VwciAlPiUgCiAgbXV0YXRlKCdmZW1hbGVfSUQnID0gcGFzdGUoTW9udGgsIFRyZWF0bWVudCwgRmVtYWxlLCBzZXAgPSAiXyIpKSAlPiUgCiAgZmlsdGVyKGZlbWFsZV9JRCAlaW4lIGYwX21vZGVsX2ZlbWFsZXMkZmVtYWxlX0lEKSAlPiUgCiAgbXV0YXRlKERheSA9IGlmX2Vsc2UoRGF5ID09ICIxX3RvXzMiLCAiU2hvcnQiLCAiTG9uZyIpLAogICAgICAgICBNb250aCA9IGZjdF9yZWxldmVsKE1vbnRoLCAiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSwKICAgICAgICAgRGF5ID0gZmN0X3JlbGV2ZWwoRGF5LCAiU2hvcnQiLCAiTG9uZyIpKQoKZjFfbW9kZWxfZGF0YSA9IEYxX2VwciAlPiUgCiAgbXV0YXRlKE9mZnNwcmluZ190ZW1wID0gYXMuZmFjdG9yKE9mZnNwcmluZ190ZW1wKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKERheSA9IGlmX2Vsc2UoRGF5ID09ICIxX3RvXzMiLCAiU2hvcnQiLCAiTG9uZyIpLAogICAgICAgICBNb250aCA9IGZjdF9yZWxldmVsKE1vbnRoLCAiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSwKICAgICAgICAgRGF5ID0gZmN0X3JlbGV2ZWwoRGF5LCAiU2hvcnQiLCAiTG9uZyIpKSAlPiUgCiAgbXV0YXRlKFBhcmVudGFsX3RyZWF0bWVudCA9IGZjdF9yZWxldmVsKFBhcmVudGFsX3RyZWF0bWVudCwgIkhlYXR3YXZlIiwgIkNvbnRyb2wiKSkKCmYwX2Vwcl9wbG90ID0gZ2dwbG90KGYwX21vZGVsX2RhdGEsIAogICAgICAgICAgICAgICAgIGFlcyh4ID0gRGF5LCB5ID0gVG90YWwsIGNvbG91ciA9IFRyZWF0bWVudCkpICsgCiAgZmFjZXRfZ3JpZCgufk1vbnRoLCBzY2FsZXMgPSAiZnJlZV95IikgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIAogIGdlb21fYm94cGxvdChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwKICAgICAgICAgICAgICAgd2lkdGggPSAwLjMpICsgCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwKICAgICAgICAgICAgIGFscGhhID0gMC41KSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiSGVhdHdhdmUiID0gImNvcmFsMyIsICJDb250cm9sIiA9ICJza3libHVlMyIpKSArIAogIGxhYnMoeSA9ICJFZ2cgUHJvZHVjdGlvbiBcbihwZXIgZmVtYWxlIHBlciBkYXkpIikgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwMCwgaGp1c3QgPSAwLCB2anVzdCA9IDAuNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSkKCmYxX2Vwcl9wbG90ID0gZ2dwbG90KGYxX21vZGVsX2RhdGEsIAogICAgICAgICAgICAgICAgIGFlcyh4ID0gZmFjdG9yKE9mZnNwcmluZ190ZW1wKSwgeSA9IFRvdGFsLCBjb2xvdXIgPSBQYXJlbnRhbF90cmVhdG1lbnQpKSArIAogIGZhY2V0X2dyaWQoTW9udGh+RGF5KSArIAogICNnZW9tX3Zpb2xpbihwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMSkpICsgCiAgZ2VvbV9ib3hwbG90KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLAogICAgICAgICAgICAgICB3aWR0aCA9IDAuMykgKyAKICBnZW9tX3BvaW50KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLAogICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJIZWF0d2F2ZSIgPSAiY29yYWwzIiwgIkNvbnRyb2wiID0gInNreWJsdWUzIikpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IGMoMCwgMTAwLCAyMDApKSArIAogIGxhYnMoeCA9ICJPZmZzcHJpbmcgVGVtcC4gKMKwQykiLCAKICAgICAgIHkgPSAiRWdnIFByb2R1Y3Rpb24gXG4ocGVyIGZlbWFsZSBwZXIgZGF5KSIsCiAgICAgICBjb2xvdXIgPSAiUGFyZW50YWwgVHJlYXRtZW50IikgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCkpCgpyYXdfZXByID0gZ2dhcnJhbmdlKGYwX2Vwcl9wbG90LCBmMV9lcHJfcGxvdCwgbnJvdyA9IDIsIAogICAgICAgICAgaGVpZ2h0cyA9IGMoMC4zLCAwLjcpLCBjb21tb24ubGVnZW5kID0gVCwgbGVnZW5kID0gImJvdHRvbSIpCgojIyMKCmYwX2hzX3Bsb3QgPSBnZ3Bsb3QoZjBfbW9kZWxfZGF0YSwgCiAgICAgICAgICAgICAgICAgYWVzKHggPSBEYXksIHkgPSBTdWNjZXNzLCBjb2xvdXIgPSBUcmVhdG1lbnQpKSArIAogIGZhY2V0X2dyaWQoLn5Nb250aCwgc2NhbGVzID0gImZyZWVfeSIpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAKICBnZW9tX2JveHBsb3QocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiAgICAgICAgICAgICAgIHdpZHRoID0gMC4zKSArIAogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIkhlYXR3YXZlIiA9ICJjb3JhbDMiLCAiQ29udHJvbCIgPSAic2t5Ymx1ZTMiKSkgKyAKICBsYWJzKHkgPSAiSGF0Y2hpbmcgU3VjY2VzcyIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMDAsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCkpCgpmMV9oc19wbG90ID0gZ2dwbG90KGYxX21vZGVsX2RhdGEsIAogICAgICAgICAgICAgICAgIGFlcyh4ID0gZmFjdG9yKE9mZnNwcmluZ190ZW1wKSwgeSA9IFN1Y2Nlc3MsIGNvbG91ciA9IFBhcmVudGFsX3RyZWF0bWVudCkpICsgCiAgZmFjZXRfZ3JpZChNb250aH5EYXkpICsgCiAgI2dlb21fdmlvbGluKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSkgKyAKICBnZW9tX2JveHBsb3QocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiAgICAgICAgICAgICAgIHdpZHRoID0gMC4zKSArIAogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIkhlYXR3YXZlIiA9ICJjb3JhbDMiLCAiQ29udHJvbCIgPSAic2t5Ymx1ZTMiKSkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLCAxKSkgKyAKICBsYWJzKHggPSAiT2Zmc3ByaW5nIFRlbXAuICjCsEMpIiwgCiAgICAgICB5ID0gIkhhdGNoaW5nIFN1Y2Nlc3MiLAogICAgICAgY29sb3VyID0gIlBhcmVudGFsIFRyZWF0bWVudCIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpKQoKcmF3X2hzID0gZ2dhcnJhbmdlKGYwX2hzX3Bsb3QsIGYxX2hzX3Bsb3QsIG5yb3cgPSAyLCAKICAgICAgICAgIGhlaWdodHMgPSBjKDAuMywgMC43KSwgY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9ICJib3R0b20iKQoKIyMjCgpmMF9wcm9kX3Bsb3QgPSBnZ3Bsb3QoZjBfbW9kZWxfZGF0YSwgCiAgICAgICAgICAgICAgICAgYWVzKHggPSBEYXksIHkgPSBIYXRjaGVkLCBjb2xvdXIgPSBUcmVhdG1lbnQpKSArIAogIGZhY2V0X2dyaWQoLn5Nb250aCwgc2NhbGVzID0gImZyZWVfeSIpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAKICBnZW9tX2JveHBsb3QocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiAgICAgICAgICAgICAgIHdpZHRoID0gMC4zKSArIAogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIkhlYXR3YXZlIiA9ICJjb3JhbDMiLCAiQ29udHJvbCIgPSAic2t5Ymx1ZTMiKSkgKyAKICBsYWJzKHkgPSAiT2Zmc3ByaW5nIFByb2R1Y3Rpb24gXG4ocGVyIGZlbWFsZSBwZXIgZGF5KSIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMDAsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCkpCgpmMV9wcm9kX3Bsb3QgPSBnZ3Bsb3QoZjFfbW9kZWxfZGF0YSwgCiAgICAgICAgICAgICAgICAgYWVzKHggPSBmYWN0b3IoT2Zmc3ByaW5nX3RlbXApLCB5ID0gSGF0Y2hlZCwgY29sb3VyID0gUGFyZW50YWxfdHJlYXRtZW50KSkgKyAKICBmYWNldF9ncmlkKE1vbnRofkRheSkgKyAKICAjZ2VvbV92aW9saW4ocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpKSArIAogIGdlb21fYm94cGxvdChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwKICAgICAgICAgICAgICAgd2lkdGggPSAwLjMpICsgCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwKICAgICAgICAgICAgIGFscGhhID0gMC41KSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiSGVhdHdhdmUiID0gImNvcmFsMyIsICJDb250cm9sIiA9ICJza3libHVlMyIpKSArIAogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKDAsIDEwMCwgMjAwKSkgKyAKICBsYWJzKHggPSAiT2Zmc3ByaW5nIFRlbXAuICjCsEMpIiwgCiAgICAgICB5ID0gIk9mZnNwcmluZyBQcm9kdWN0aW9uIFxuKHBlciBmZW1hbGUgcGVyIGRheSkiLAogICAgICAgY29sb3VyID0gIlBhcmVudGFsIFRyZWF0bWVudCIpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpKQoKcmF3X3Byb2R1Y3Rpb24gPSBnZ2FycmFuZ2UoZjBfcHJvZF9wbG90LCBmMV9wcm9kX3Bsb3QsIG5yb3cgPSAyLCAKICAgICAgICAgIGhlaWdodHMgPSBjKDAuMywgMC43KSwgY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9ICJib3R0b20iKQoKZ2dhcnJhbmdlKHJhd19lcHIsIHJhd19ocywgcmF3X3Byb2R1Y3Rpb24sIG5yb3cgPSAxLCBjb21tb24ubGVnZW5kID0gVCwgbGVnZW5kID0gImJvdHRvbSIsCiAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIpCmBgYAoKYGBge3Igc3VwcC00LWVmZmVjdC1zaXplLWdyaWQsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTh9CiNTdWJzZXF1ZW50IFJvd3MKRjFfaHNfZWZmZWN0X3NpemUkdHJhaXQgPSAiSFMiCkYxX2hzX2VmZmVjdF9zaXplJGdlbmVyYXRpb24gPSAiRjEiCgpGMV90b3RhbF9lZmZlY3Rfc2l6ZSR0cmFpdCA9ICJFUFIiCkYxX3RvdGFsX2VmZmVjdF9zaXplJGdlbmVyYXRpb24gPSAiRjEiCgpGMV9yZl9lZmZlY3Rfc2l6ZSR0cmFpdCA9ICJPUCIKRjFfcmZfZWZmZWN0X3NpemUkZ2VuZXJhdGlvbiA9ICJGMSIKCkYxX2JzX2VmZmVjdF9zaXplJHRyYWl0ID0gIlNpemUiCkYxX2JzX2VmZmVjdF9zaXplJGdlbmVyYXRpb24gPSAiRjEiCgpGMF9zaXplX3N1bW1hcnkgPSBkYXRhLmZyYW1lKCJ0cmFpdCIgPSAiU2l6ZSIsIGdlbmVyYXRpb24gPSAiRjAiLCBtb250aCA9ICJKdW5lIiwgZHVyYXRpb24gPSAibG9uZyIpCgpGMF9kYXRhID0gYmluZF9yb3dzKEYwX2hzX3N1bW1hcnksIEYwX3RvdGFsX3N1bW1hcnksRjBfcmZfc3VtbWFyeSwgRjBfc2l6ZV9zdW1tYXJ5KSAlPiUKICBkcGx5cjo6c2VsZWN0KHRyYWl0LCBkaWZmZXJlbmNlLCBiY2FfY2lfbG93LCBiY2FfY2lfaGlnaCwgbW9udGgsIGR1cmF0aW9uLCB0cmFpdCwgZ2VuZXJhdGlvbikgJT4lCiAgbXV0YXRlKCJvcmRlcl9jb2RlIiA9IHBhc3RlKHRyYWl0LCBkdXJhdGlvbiwgc2VwID0gIl8iKSwKICAgICAgICAgIm9yZGVyX251bWJlciIgPSBjYXNlX3doZW4oCiAgICAgICAgICAgb3JkZXJfY29kZSA9PSAidG90YWxfc2hvcnQiIH4gMSwKICAgICAgICAgICBvcmRlcl9jb2RlID09ICJ0b3RhbF9sb25nIiB+IDIsCiAgICAgICAgICAgb3JkZXJfY29kZSA9PSAic3VjY2Vzc19zaG9ydCIgfiAzLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInN1Y2Nlc3NfbG9uZyIgfiA0LAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInByb2R1Y3Rpb25fc2hvcnQiIH4gNSwKICAgICAgICAgICBvcmRlcl9jb2RlID09ICJwcm9kdWN0aW9uX2xvbmciIH4gNiwKICAgICAgICAgICBvcmRlcl9jb2RlID09ICJzaXplX2xvbmciIH4gNyksCiAgICAgICAgIG1vbnRoID0gZmN0X3JlbGV2ZWwobW9udGgsICJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpLAogICAgICAgICB0cmFpdCA9IGNhc2Vfd2hlbigKICAgICAgICAgICB0cmFpdCA9PSAidG90YWwiIH4gIkVQUiIsIAogICAgICAgICAgIHRyYWl0ID09ICJzdWNjZXNzIiB+ICJIUyIsIAogICAgICAgICAgIHRyYWl0ID09ICJwcm9kdWN0aW9uIiB+ICJPUCIsIAogICAgICAgICAgIHRyYWl0ID09ICJTaXplIiB+ICJTaXplIiksCiAgICAgICAgICAgZmN0X3JlbGV2ZWwodHJhaXQsICJFUFIiLCAiSFMiLCAiT1AiLCAiU2l6ZSIpLAogICAgICAgICBkdXJhdGlvbiA9IGZjdF9yZWxldmVsKGR1cmF0aW9uLCAic2hvcnQiLCAibG9uZyIpLAogICAgICAgICBncm91cF9JRCA9IHBhc3RlKG1vbnRoLCB0cmFpdCwgc2VwID0gIl8iKSkKCkYwX2RhdGEkb3JkZXJfbnVtYmVyID0gZmFjdG9yKEYwX2RhdGEkb3JkZXJfbnVtYmVyLCBsZXZlbHMgPSBjKDEsMiwzLDQsNSw2LDcpKQoKCkYxX2RhdGEgPSBiaW5kX3Jvd3MoRjFfdG90YWxfZWZmZWN0X3NpemUsIEYxX2hzX2VmZmVjdF9zaXplLCBGMV9yZl9lZmZlY3Rfc2l6ZSwgRjFfYnNfZWZmZWN0X3NpemUpICU+JQogIGRwbHlyOjpzZWxlY3QodHJhaXQsIGRpZmZlcmVuY2UsIGJjYV9jaV9sb3csIGJjYV9jaV9oaWdoLCBtb250aCwgZHVyYXRpb24sIGdlbmVyYXRpb24sIG9mZl90ZW1wKSAlPiUKICBtdXRhdGUoIm9yZGVyX2NvZGUiID0gcGFzdGUodHJhaXQsIGR1cmF0aW9uLCBzZXAgPSAiXyIpLAogICAgICAgICAib3JkZXJfbnVtYmVyIiA9IGNhc2Vfd2hlbigKICAgICAgICAgICBvcmRlcl9jb2RlID09ICJFUFJfc2hvcnQiIH4gMSwKICAgICAgICAgICBvcmRlcl9jb2RlID09ICJFUFJfbG9uZyIgfiAyLAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gIkhTX3Nob3J0IiB+IDMsCiAgICAgICAgICAgb3JkZXJfY29kZSA9PSAiSFNfbG9uZyIgfiA0LAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gIk9QX3Nob3J0IiB+IDUsCiAgICAgICAgICAgb3JkZXJfY29kZSA9PSAiT1BfbG9uZyIgfiA2LAogICAgICAgICAgIG9yZGVyX2NvZGUgPT0gIlNpemVfc2hvcnQiIH4gNywKICAgICAgICAgICBvcmRlcl9jb2RlID09ICJTaXplX2xvbmciIH4gOCksCiAgICAgICAgIHRyYWl0ID0gaWZfZWxzZSh0cmFpdCA9PSAiZXByIiwgInRvdGFsIiwgdHJhaXQpLAogICAgICAgICBtb250aCA9IGZjdF9yZWxldmVsKG1vbnRoLCAiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSwKICAgICAgICAgdHJhaXQgPSBmY3RfcmVsZXZlbCh0cmFpdCwgIkVQUiIsICJIUyIsICJPUCIsICJTaXplIiksCiAgICAgICAgIGR1cmF0aW9uID0gZmN0X3JlbGV2ZWwoZHVyYXRpb24sICJzaG9ydCIsICJsb25nIikpCgoKRjFfZGF0YSRvcmRlcl9udW1iZXIgPSBmYWN0b3IoRjFfZGF0YSRvcmRlcl9udW1iZXIsIGxldmVscyA9IGMoMSwyLDMsNCw1LDYsNyw4KSkKCiNUb3Agcm93IC0gRjAgKGRpcmVjdCBlZmZlY3RzKQp4LmF4aXNfbGFiZWxzID0gYygiMSIgPSAic2hvcnQiLCAiMiIgPSAibG9uZyIsICIzIiA9ICJzaG9ydCIsICI0IiA9ICJsb25nIiwKICAgICAgICAgICAgICAgICAgIjUiID0gInNob3J0IiwgIjYiID0gImxvbmciLCAiNyIgPSAic2hvcnQiLCAiOCIgPSAibG9uZyIpCgpGMF9ncmlkID0gZ2dwbG90KEYwX2RhdGEsIGFlcyh4ID0gZHVyYXRpb24sIHkgPSBkaWZmZXJlbmNlLCBjb2xvdXIgPSB0cmFpdCwgZ3JvdXAgPSBncm91cF9JRCkpICsKICBmYWNldF9ncmlkKC4gfiBtb250aCkgKwogIGdlb21fbGluZShwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC43KSwKICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG91ciA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuMykgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBiY2FfY2lfbG93LCB5bWF4ID0gYmNhX2NpX2hpZ2gpLCB3aWR0aCA9IDAsIGxpbmV3aWR0aCA9IDEsCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC43KSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQsIGZpbGwgPSAid2hpdGUiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC43KSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJsb25nIiA9IDE2LCAic2hvcnQiID0gMjEpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9IHguYXhpc19sYWJlbHMpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIlNpemUiID0gImRhcmtncmV5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhTIiA9ICJnb2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9QIiA9ICJmb3Jlc3RncmVlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFUFIiID0gImNvcm5mbG93ZXJibHVlIikpICsKICB4bGFiKCIiKSArCiAgeWxhYigiRWZmZWN0IFNpemVcbkhlYXR3YXZlIC0gQ29udHJvbCIpICsKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMikgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gLTQ1LCBoanVzdCA9IDAsIHZqdXN0ID0gMC41KSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgojRm9sbG93aW5nIHRocmVlIHJvd3MgLSBGMSAodHJhbnNnZW5lcmF0aW9uIC8gaW5kaXJlY3QgZWZmZWN0cykKRjFfZ3JpZCA9IGdncGxvdChGMV9kYXRhLCBhZXMoeCA9IGR1cmF0aW9uLCB5ID0gZGlmZmVyZW5jZSwgY29sb3VyID0gdHJhaXQsIGdyb3VwID0gdHJhaXQpKSArCiAgZmFjZXRfZ3JpZChvZmZfdGVtcCB+IG1vbnRoLCApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAwLjMpICsKICBnZW9tX2xpbmUocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiAgICAgICAgICAgIGxpbmV3aWR0aCA9IDEpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gYmNhX2NpX2xvdywgeW1heCA9IGJjYV9jaV9oaWdoKSwgd2lkdGggPSAwLCBsaW5ld2lkdGggPSAxLAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLCBmaWxsID0gIndoaXRlIiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygibG9uZyIgPSAxNiwgInNob3J0IiA9IDIxKSkgKwogIHhsaW0oMC41LDQuNSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPSB4LmF4aXNfbGFiZWxzKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJTaXplIiA9ICJkYXJrZ3JleSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIUyIgPSAiZ29sZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPUCIgPSAiZm9yZXN0Z3JlZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVBSIiA9ICJjb3JuZmxvd2VyYmx1ZSIpKSArCiAgeGxhYigiIikgKwogIHlsYWIoIkVmZmVjdCBTaXplIFxuSGVhdHdhdmUgLSBDb250cm9sIikgKwogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDEyKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IC00NSwgaGp1c3QgPSAwLCB2anVzdCA9IDAuNSkpCgpnZ2FycmFuZ2UoRjBfZ3JpZCwgRjFfZ3JpZCwgbnJvdyA9IDIsIG5jb2wgPSAxLCBoZWlnaHRzID0gYygwLjM1LDEpLCBjb21tb24ubGVnZW5kID0gVCwgbGVnZW5kID0gInJpZ2h0IiwgbGFiZWxzID0gIkFVVE8iKQpgYGAKCmBgYHtyIHN1cHAtNS1GMC1kdXJhdGlvbi1lZmZlY3RzLCBmaWcud2lkdGg9NywgZmlnLmhlaWdodD03fQpGMF9yZl9zdW1tYXJ5JG1vbnRoID0gZmFjdG9yKEYwX3JmX3N1bW1hcnkkbW9udGgsIGxldmVscyA9IGMoIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIikpCkYwX3JmX3N1bW1hcnkkZHVyYXRpb24gPSBmYWN0b3IoRjBfcmZfc3VtbWFyeSRkdXJhdGlvbiwgbGV2ZWxzID0gYygic2hvcnQiLCAibG9uZyIpKQpGMF9kdXJfc3VtbWFyeSRtb250aCA9IGZhY3RvcihGMF9kdXJfc3VtbWFyeSRtb250aCwgbGV2ZWxzID0gYygiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSkKCmdncGxvdChGMF9kdXJfc3VtbWFyeSwgYWVzKHggPSBtb250aCwgeSA9IGRpZmZlcmVuY2UsIGZpbGwgPSB0cmVhdG1lbnQpKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIAogICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLAogICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGJjYV9jaV9sb3csIHltYXggPSBiY2FfY2lfaGlnaCksCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwKICAgICAgICAgICAgICAgIHdpZHRoID0gMC4yLCBsaW5ld2lkdGggPSAwLjc1KSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkNvbnRyb2wiID0gImdyZXkzMCIsICJIZWF0d2F2ZSIgPSAid2hpdGUiKSkgKyAKICBsYWJzKHkgPSAiRWZmZWN0IFNpemUgKEhlZGdlJ3MgZylcbkxvbmcgLSBTaG9ydCBldmVudHMiLAogICAgICAgeCA9ICIiKSArIAogIHRoZW1lX21hdHQoKQpgYGAKCmBgYHtyIHN1cHAtNi1wcm9kdWN0aW9uLXNpemUtY2hhbmdlfQplZmZlY3RfY29yciA9IEYxX3N1bW1hcnkgJT4lCiAgc2VsZWN0KHRyYWl0LCBkaWZmZXJlbmNlLCBtb250aCwgZHVyYXRpb24sIG9mZl90ZW1wKSAlPiUKICBwaXZvdF93aWRlcihpZF9jb2xzID0gYyhtb250aCwgZHVyYXRpb24sIG9mZl90ZW1wKSwKICAgICAgICAgICAgICBuYW1lc19mcm9tID0gdHJhaXQsCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBkaWZmZXJlbmNlKQoKZ2dwbG90KGVmZmVjdF9jb3JyLCBhZXMoeCA9IGBib2R5IHNpemVgLCB5ID0gcHJvZHVjdGlvbikpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYsCiAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk2MCIsCiAgICAgICAgICAgICAgc2l6ZSA9IDEpICsKICBsYWJzKHggPSAiQm9keSBTaXplIEVmZmVjdCIsCiAgICAgICB5ID0gIlByb2R1Y3Rpb24gRWZmZWN0IikgKwogIHRoZW1lX21hdHQoKQpgYGAKCmBgYHtyIHN1cHAtNy1mMS1zaXplLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodD02fQpkYXlfY29scyA9IGMoIlNob3J0IiA9ICJncmV5ODAiLCAiTG9uZyIgPSAiZ3JleTMwIikKCnNpemVfdGVtcDEgPSBnZ3Bsb3QoZjFfc2l6ZV9kYXRhLCBhZXMoeCA9IE9mZnNwcmluZ190ZW1wLCB5ID0gU2l6ZSwgY29sb3VyID0gUGFyZW50YWxfdHJlYXRtZW50KSkgKyAKICBmYWNldF9ncmlkKE1vbnRofkRheSkgKyAKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuNSwgc2l6ZSA9IDEuNiwgYWxwaGEgPSAwLjQpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBsaW5ld2lkdGggPSAxLjQsIGFscGhhID0gMC4yKSArIAogIGxhYnMoeCA9ICJPZmZzcHJpbmcgVGVtcGVyYXR1cmUgKMKwQykiLAogICAgICAgeSA9ICJTaXplIChtbSkiLAogICAgICAgY29sb3VyID0gIlBhcmVudGFsIFRyZWF0bWVudCIpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoMTIsMTcsMjIpKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiSGVhdHdhdmUiID0gImNvcmFsMyIsICJDb250cm9sIiA9ICJza3libHVlMyIpKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTUpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3VyID0gImJsYWNrIikpCgpzaXplX3RlbXAyID0gZW1tZWFuczo6ZW10cmVuZHMoRjFfc2l6ZS5tb2RlbCwgYygiTW9udGgiLCAiRGF5IiwgIlBhcmVudGFsX3RyZWF0bWVudCIpLCB2YXIgPSAiT2Zmc3ByaW5nX3RlbXAiKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBQYXJlbnRhbF90cmVhdG1lbnQsIHkgPSBPZmZzcHJpbmdfdGVtcC50cmVuZCwgCiAgICAgICAgICAgICBjb2xvdXIgPSBEYXksIGdyb3VwID0gRGF5KSkgKyAKICBmYWNldF93cmFwKE1vbnRofi4pICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAKICBnZW9tX2xpbmUobGluZXdpZHRoID0gMS41LAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbG93ZXIuQ0wsIHltYXggPSB1cHBlci5DTCksCiAgICAgICAgICAgICAgICBsaW5ld2lkdGggPSAxLjUsIHdpZHRoID0gMC41LAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMywKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gZGF5X2NvbHMpICsgCiAgbGFicyh4ID0gIlBhcmVudGFsIFRyZWF0bWVudCIsICAKICAgICAgIHkgPSAiU2l6ZSBTbG9wZSAobW0gLyDCsEMpIikgKyAKICB0aGVtZV9tYXR0KGJhc2Vfc2l6ZSA9IDE1KSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMjkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpLAogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIikpCgpnZ2FycmFuZ2Uoc2l6ZV90ZW1wMSwgc2l6ZV90ZW1wMiwgbGFiZWxzID0gIkFVVE8iLCBjb21tb24ubGVnZW5kID0gRiwgbGVnZW5kID0gImJvdHRvbSIpCmBgYAoKYGBge3Igc3VwcC04LWYxLXNpemUtY29udHJhc3RzLCBmaWcud2lkdGg9NywgZmlnLmhlaWdodD03fQpmMV9zaXplX2NvbnRyYXN0cyA9IGVtbWVhbnM6OmVtbWVhbnMoRjFfc2l6ZS5tb2RlbCwgfiBQYXJlbnRhbF90cmVhdG1lbnQgfCBEYXkgKiBNb250aCAqIE9mZnNwcmluZ190ZW1wLCB0eXBlID0gInJlc3BvbnNlIiwgYXQgPSBsaXN0KE9mZnNwcmluZ190ZW1wID0gYygxMiwxNywyMikpKSAlPiUgCiAgcGFpcnMoKSAlPiUgZGF0YS5mcmFtZSgpICU+JSAKICBkcm9wX25hKCkgJT4lIAogIG11dGF0ZSgiSUQiID0gcGFzdGUwKE1vbnRoLCBPZmZzcHJpbmdfdGVtcCkpICU+JSAKICBmaWx0ZXIoIShJRCA9PSAiTm92ZW1iZXIxMiIgJiBEYXkgPT0gIlNob3J0IikpICU+JSAKICBmaWx0ZXIoIShJRCA9PSAiTm92ZW1iZXIyMiIgJiBEYXkgPT0gIlNob3J0IikpCgpnZ3Bsb3QoZjFfc2l6ZV9jb250cmFzdHMsIGFlcyh4ID0gRGF5LCB5ID0gZXN0aW1hdGUsIGdyb3VwID0gSUQpKSArCiAgZmFjZXRfZ3JpZChPZmZzcHJpbmdfdGVtcH5Nb250aCkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIAogIGdlb21fbGluZShsaW5ld2lkdGggPSAwLjgpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMikgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gZXN0aW1hdGUgLSBTRSwgeW1heCA9IGVzdGltYXRlICsgU0UpLCB3aWR0aCA9IDAuMSwgbGluZXdpZHRoID0gMSkgKyAKICBsYWJzKHggPSAiRHVyYXRpb24iLAogICAgICAgeSA9ICJFZmZlY3QgKG1tOyBDb250cm9sIC0gSGVhdHdhdmUpIikgKyAKICB0aGVtZV9idygpICsgCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgoKCg==